use std::fmt::format;

struct Rectangle {
    width: i32,
    height: i32,
}

impl Rectangle {
    fn circle(&self) -> i32 {
        (self.width + self.height) * 2
    }
    fn canHandle(&self, other: Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

pub fn add(left: usize, right: usize) -> usize {
    left + right
}

pub fn greeting(str: &str) -> String {
    format!("Hello {}", str)
}
pub struct Guess {
    value: i32,
}

impl Guess {
    pub fn new(num: i32) -> Guess {
        if num < 1 {
            panic!("value should > 1")
        } else if num > 100 {
            panic!("value should < 100")
        }
        Guess { value: num }
    }
}

// test  并行运行  不显示所有输出

// 并行运行测试  默认使用多个线程并行允许
// - 确保测试之间，不会互相依赖，不依赖于某个共享状态（环境、工作目录、环境变量等等）

// 失败时会显示输出，成功不显示

// 允许指定测试 
// - 单个直接指定测试名
// - 多个指定测试名的一部分（模块名也可以）
#[cfg(test)]
mod tests {
    // 外部模块的所有内容
    use super::*;

    #[test]
    fn exploration() {
        let result = add(2, 2);
        assert_eq!(result, 4);
    }

    // #[test]
    // fn another() {
    //     panic!("make this test fail");
    // }

    #[test]
    fn rectangle() {
        let rect1: Rectangle = Rectangle {
            width: 20,
            height: 48,
        };
        let rect2: Rectangle = Rectangle {
            width: 18,
            height: 28,
        };
        // true的话：就可以通过编译
        assert!(rect1.canHandle(rect2))
        // 还有两个宏   assert_eq!(par1,par2,[mess])(相等)和assert_ne!(par1,par2,[mess])(不相等)
    }

    #[test]
    fn greeting_contact_name() {
        let result = greeting("Carol");
        assert!(
            result.contains("Carol"),
            "greeting didn't find Carol,value is '{}'",
            result
        )
    }

    #[test]
    #[should_panic(expected = "value should < 100")] // 没有发生panic恐慌的话会失败  可以添加expected  判断panic的错误信息是否包含expected的信息  包含就可通过
    fn guess_number() {
        Guess::new(200);
    }

    #[test]
    // 使用Result<T,E>编写的测试，不要加上should_panic，因为不会发生恐慌
    fn add_is_right() -> Result<(), String> {
        if 2 + 2 == 4 {
            Ok(())
        } else {
            Err(String::from("错误"))
        }
    }
}
